package it.unisa.unibox.Storage;

import it.unisa.unibox.beans.Account;
import it.unisa.unibox.beans.Amministratore;
import it.unisa.unibox.beans.AreaScientifica;
import it.unisa.unibox.beans.Dipartimento;
import it.unisa.unibox.beans.Evento;
import it.unisa.unibox.beans.ResponsabileValutazione;
import it.unisa.unibox.beans.Ricercatore;
import it.unisa.unibox.bridge.IAutenticazioneManager;
import it.unisa.unibox.commons.DBConnection;

import java.sql.ResultSet;
import java.sql.SQLException;

public class DBAutenticazione implements IAutenticazioneManager {

	private static DBAutenticazione dbautenticazione;

	/**
	 * Singleton pattern, restituisce un'istanza dell'oggetto
	 * @return l'oggetto
	 */
	public static DBAutenticazione getInstance() {
		if (dbautenticazione == null)
			dbautenticazione = new DBAutenticazione();
		return dbautenticazione;
	}

	/**
	 * Effettua l'autenticazione
	 * @param nome 
	 * @param psw
	 * @return l'account loggato se trovato nel db, null altrimenti
	 * @throws SQLException
	 */
	@Override
	public Account login(String nome, String psw) throws SQLException {
		// TODO: rivedere e ridiscutere valore di ritorno di questa query...
		//
		String query = "SELECT * FROM account WHERE username= '" + nome
				+ "' && password='" + psw + "';";
		ResultSet rs = DBConnection.execQuery(query);
		Account a = null;
		if (rs.next()) {
			String username = rs.getString("username");
			String password = rs.getString("password");
			int tipologia = rs.getInt("tipologia");
			int id = rs.getInt("ID");
			a = new Account(id, username, password, tipologia);
		}
		
		return a;
	}

	/**
	 * Restitusce il ricercatore associato all'account
	 * @param account 
	 * @return ricercatore, null se non trovato
	 * @throws SQLException
	 */
	@Override
	public Ricercatore retrieveRicercatore(Account account) throws SQLException {
		String query = "SELECT * FROM ricercatore WHERE ID_Account= '"
				+ account.getId() + "';";
		ResultSet rs = DBConnection.execQuery(query);
		Ricercatore ricercatore = null;
		int id;
		String nome;
		String cognome;
		String codFisc;
		String sesso;
		String email;
		String cittaNascita;
		// Account account = account;
		Dipartimento dipartimento;
		AreaScientifica areaScientifica;
		int matricola;
		int ruolo;
		String dataNascita;
		String dataInizioServizio;
		if (rs.next()) {
			id = rs.getInt("ID");
			nome = rs.getString("nome");
			cognome = rs.getString("cognome");
			codFisc = rs.getString("codFisc");
			sesso = rs.getString("sesso");
			email = rs.getString("email");
			cittaNascita = rs.getString("cittaNascita");

			dipartimento = DBUtilityQuerys.getInstance().retrieveDipartimento(
					rs.getInt("dipartimento"));
			areaScientifica = DBUtilityQuerys.getInstance()
					.retrieveAreaScientifica(rs.getInt("area_scientifica"));
			matricola = rs.getInt("matricola");
			ruolo = rs.getInt("ruolo");
			dataNascita = rs.getString("dataNascita");
			dataInizioServizio = rs.getString("dataInizioServizio");
			ricercatore = new Ricercatore(id, account, nome, cognome, codFisc,
					sesso, email, cittaNascita, dipartimento, areaScientifica,
					matricola, ruolo, dataNascita, dataInizioServizio);
		}
		
		return ricercatore;
	}

	/**
	 * Restitusce l'amministratore associato all'account
	 * @param account 
	 * @return amministratore, null se non trovato
	 * @throws SQLException
	 */
	@Override
	public Amministratore retrieveAmministratore(Account account)
			throws SQLException {
		String query = "SELECT * FROM amministratore WHERE ID_Account= '"
				+ account.getId() + "';";
		ResultSet rs = DBConnection.execQuery(query);
		Amministratore amministratore = null;
		// Account account=account;
		String nome;
		String cognome;
		if (rs.next()) {
			nome = rs.getString("nome");
			cognome = rs.getString("cognome");
			amministratore = new Amministratore(account, nome, cognome);
		}
		return amministratore;
	}

	/**
	 * Restitusce il responsabile valutazione associato all'account
	 * @param account 
	 * @return responsabile, null se non trovato
	 * @throws SQLException
	 */
	@Override
	public ResponsabileValutazione retrieveResponsabileValutazione(
			Account account) throws SQLException {
		String query = "SELECT * FROM responsabile_valutazione WHERE ID_Account= '"
				+ account.getId() + "';";
		ResultSet rs = DBConnection.execQuery(query);
		ResponsabileValutazione resp = null;
		// Account account=account;
		String nome;
		String cognome;
		Evento evento;
		if (rs.next()) {
			nome = rs.getString("nome");
			cognome = rs.getString("cognome");
			evento = null;// TODO retrieve evento
			resp = new ResponsabileValutazione(account, nome, cognome, evento);
		}
		
		return resp;
	}

}
